/**
 * \class IExpVisitor IExpVisitor.h <AbsSyn/IExpVisitor.h>
 *
 *  Created on: 31 mar 2011
 *      Author: ytc0039
 *
 * \ingroup Interfaces
 *
 * \brief Interface for whom wants to be using the visitors pattern
 * on the expressions.
 */

#ifndef IEXPVISITOR_H_
#define IEXPVISITOR_H_

class ModulusExp;
class AddExp;
class IntExp;
class IdentExp;
class DoubleExp;
class BoolExp;

class IExpVisitor {

public:
	virtual ~IExpVisitor(){};

	/**
	 * \brief Will be called when an expression is of type AddExp
	 *
	 * @see AddExp
	 * and for more information on visitor pattern see
	 * @see IExpVisitable
	 * @param v caller
	 */
	virtual void VisitAddExp(AddExp *v)=0;
	/**
	 * \brief Will be called when an expression is of type IntExp
	 *
	 * @see IntExp
	 * and for more information on visitor pattern see
	 * @see IExpVisitable
	 * @param v caller
	 */
	virtual void VisitIntExp(IntExp *v)=0;


	virtual void VisitDoubleExp(DoubleExp *v)=0;

	virtual void VisitBoolExp(BoolExp *v)=0;

	/**
	 * \brief Will be called when an expression is of type IdentExp
	 *
	 * @see IdentExp and Ident
	 * and for more information on visitor pattern see
	 * @see IExpVisitable
	 * @param v caller
	 */
	virtual void VisitIdentExp(IdentExp *v)=0;

	/**
	 * \brief Will be called when an expression is of type ModulusExp
	 *
	 * @see ModulusExp
	 * and for more information on visitors pattern see
	 * @see IExpVisitable
	 * @param v caller Implementing IExpVisitor
	 */
	virtual void VisitModulusExp(ModulusExp *v) =0;
};
#endif /* IEXPVISITOR_H_ */
